package day13;
//测试克隆
//1.实现一个Cloneable接口(表示允许克隆,否则会出现CloneNotSupportException异常)
//2.重写clone()
//3.如果要实现深克隆，对象中的属性是引用类型的话，也需要重复实现第一步和第二步
public class TestClone {
    public static void main(String[] args) throws CloneNotSupportedException {
        //测试浅克隆
//        A a=new A();
//        a.id=100;
//        a.name="茜茜";
//
//        A a2=(A)a.clone();
//        System.out.println(a);
//        System.out.println(a2);
//
//        a.id=1000;
//        a.name="你好";
//
//        a.b.id=1;
//        a.b.name="大佬";
//
//        a.print();
//        a2.print();

        //测试深克隆
//        A a=new A();
//        a.id=100;
//        a.name="张三";
//        a.b=new B();
//
//        A a2=(A)a.clone();
//        System.out.println(a);
//        System.out.println(a2);
//        a.id=1000;
//        a.name="李四";
//        a.b.id=10000;
//        a.b.name="小万鑫";
//        a.print();
//        //a2无论是基本类型和String和引用类型都和上面的a没有关系，才是深克隆成功
//        a2.print();

        //深克隆A(B(C))
        A a=new A();
        a.b=new B();
        a.b.c=new C();

        A a2=(A)a.clone();

        a.print();
        a2.print();
    }
}
class A implements Cloneable{
    Integer id;  //基本类型
    String name;  //String
    B b;  //引用类型，对象类型
    protected Object clone() throws CloneNotSupportedException {
        A a=(A)super.clone();
        //深克隆必须要加一句话，必须通过clone(),给引用类型赋值
        a.b=(B)a.b.clone();
        return  a;
    }
    public void print(){
        //System.out.println(id+" "+name+" "+b+"==="+b.id+" "+b.name);
        System.out.println(this+" "+b+" "+b.c);
    }
}

class B implements Cloneable{
    Integer id;
    String name;
    C c;
    protected Object clone() throws CloneNotSupportedException {
        B b=(B)super.clone();
        b.c=(C)b.c.clone();
        return b;
    }
}

class C implements Cloneable{
    Integer id;
    String name;
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }

}